package sma.organizations.roles;

import java.util.Vector;

import org.janusproject.kernel.crio.core.Role;
import org.janusproject.kernel.message.Message;
import org.janusproject.kernel.status.Status;
import org.janusproject.kernel.status.StatusFactory;

import appli.utils.Config;
import appli.utils.PointPondere;

import sma.agents.bodies.CircleBody;
import sma.environment.LocalEnvironment;
import sma.organizations.messages.MassCenterMessage;
import sma.organizations.messages.MassCenterResponseMessage;

/**
 * Le role du centre qui permet de déclarer le vecteur direction (et vitesse) pour la voiture
 * @author Etienne Sainton
 * @version 0.1
 * @since 0.1
 */
public class DecisiveMassCenter extends Role {
	/**
	 * 
	 * Son environnement local
	 * 
	 */
	private sma.environment.LocalEnvironment environment;

	/**
	 * 
	 * Son body
	 * 
	 */
	private sma.agents.bodies.CircleBody body;

	/**
	 * Les stades de la vie de cet agent. En fait il n'y a que I_M_HERE
	 * @author Etienne Sainton
	 *
	 */
	public enum State {
		 /**
		 * Reponds en donnant sa position
		 */
		I_M_HERE
		;
	}

	/**
	 * 
	 * Etat courant du role
	 * 
	 */
	private State currentState = State.I_M_HERE;

	/**
	 * Initialisation de l'agent. Automatiquement appelee par le constructeur
	 * 
	 * @param _environment l'environnement dans lequel évolue l'agent
	 * @param _body l'ihm
	 */
	private void init(sma.environment.LocalEnvironment _environment,
			sma.agents.bodies.CircleBody _body) {
		environment = _environment;
		body = _body;
	}

	/**
	 * Override de l'activate defini par Janus. Nous en profitons pour lui
	 * affecter son environnement et son body.
	 */
	@Override
	public Status activate(Object... params) {
		init((LocalEnvironment) params[0], (CircleBody) params[1]);

		if (Config.DEBUG == true)
			System.out.println("Le role DecisiveMassCenter est initialise");

		return StatusFactory.ok(this);
	}
	@Override
	public Status live() {
		this.currentState = run();
		return StatusFactory.ok(this);
	}
	
	private State run() {
		// Selon l'état dans lequel voyons ce qu'on fait ?
		switch (this.currentState) {
		case I_M_HERE:
			// Listons les agents qui nous ont répondu qu'ils nous voyaient :
			for (Message msg : getMailbox()) {
				//Si le message provient du MassCenter agent
				if (msg instanceof MassCenterMessage) {
					//TODO ajouter la vitesse 
					//Je lui renvoie ma position et ma vitesse
					broadcastMessage(MassCenter.class, new MassCenterResponseMessage(
							new PointPondere(this.body.getPosition(),this.body.getVitesse(),this.body.getEnergie(), this.body.getGroupe())));
				}else{
					//Aucun autre type de message est attendu
					if (Config.DEBUG == true)
						System.out.println("DecisiveMassCenter Role : " +
							"reception d'un message inconnu :"
							+ msg.toString());
				}
			}
			
			return State.I_M_HERE;
		
		}
		return State.I_M_HERE;
	}

}
